home *** CD-ROM | disk | FTP | other *** search
/ DOR (English Version) / DOR (English Version).iso / directx.cab / dxdiag.chm / devdoc / langref.js < prev    next >
Text File  |  1999-09-09  |  19KB  |  794 lines

  1. //
  2. // Common code
  3. //
  4. var ie4 = false;
  5. var advanced = false;
  6. var curLang = null;
  7. var showAll = true;
  8. var cook = null;
  9. var baseUrl = document.scripts[document.scripts.length - 1].src.replace(/[^\/]+.js/, "");
  10.  
  11. if (navigator.appName == "Microsoft Internet Explorer") {
  12.     var ver = navigator.appVersion;
  13.     var v = new Number(ver.substring(0,ver.indexOf(".", 0)));
  14.     if (v >= 4) {
  15.         advanced = true;
  16.         ie4 = true;
  17.  
  18.         // Look for 5.x buried somewhere in the version string.
  19.         var toks = ver.split(/[^0-9.]/);
  20.         if (toks) {
  21.             for (var i = 0; i < toks.length; i++) {
  22.                 var tok = toks[i];
  23.                 if (tok.indexOf(".", 0) > 0) {
  24.                     if (tok >= 5)
  25.                         ie4 = false;
  26.                 }
  27.             }
  28.         }
  29.     }
  30. }
  31.  
  32. if (advanced)
  33.     window.onload = bodyOnLoad;
  34.  
  35. function bodyOnClick()
  36. {
  37.     if (advanced) {
  38.         hideTip();
  39.         closeMenu();
  40.         hideSeeAlso();
  41.     }
  42. }
  43.  
  44. function bodyOnLoad()
  45. {
  46.     if (advanced) {
  47.         initLangs();
  48.         initReftips();
  49.         initSeeAlso();
  50.         document.body.onclick = bodyOnClick;
  51.     }
  52. }
  53.  
  54. //
  55. // Language filtering
  56. //
  57. function initLangs()
  58. {
  59.     var hdr = document.all.hdr;
  60.     if (!hdr)
  61.         return;
  62.  
  63.     var langs = new Array;
  64.     var spans = document.all.tags("SPAN");
  65.     if (spans) {
  66.         var iElem = spans.length;
  67.         for (iElem = 0; iElem < spans.length; iElem++) {
  68.             var elem = spans[iElem];
  69.             if (elem.className == "lang") {
  70.  
  71.                 // Update the array of unique language names.
  72.                 var a = elem.innerText.split(",");
  73.                 for (var iTok = 0; iTok < a.length; iTok++) {
  74.                     var m = a[iTok].match(/([A-Za-z].*[A-Za-z+])/);
  75.                     if (m) {
  76.                         var iLang = 0;
  77.                         while (iLang < langs.length && langs[iLang] < m[1])
  78.                             iLang++;
  79.                         if (iLang == langs.length || langs[iLang] != m[1]) {
  80.                             var before = langs.slice(0,iLang);
  81.                             var after = langs.slice(iLang);
  82.                             langs = before.concat(m[1]).concat(after);
  83.                         }
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.     }
  89.  
  90.     if (langs.length > 0) {
  91.         var pres = document.all.tags("PRE");
  92.         if (pres) {
  93.             for (var iPre = 0; iPre < pres.length; iPre++)
  94.                 initPreElem(pres[iPre]);
  95.         }
  96.  
  97.         var obj = document.all.obj_cook;
  98.         if (obj && obj.object) {
  99.             cook = obj;
  100.             var lang = obj.getValue("lang");
  101.             var iLang = langs.length - 1;
  102.             while (iLang && langs[iLang] != lang)
  103.                 iLang--;
  104.             curLang = langs[iLang];
  105.             if (obj.getValue("lang.all") != "1")
  106.                 showAll = false;
  107.         }
  108.  
  109.         var iLim = document.body.children.length;
  110.         var head = null;
  111.         for (var i = 0; i < iLim; i++) {
  112.             var elem = document.body.children[i];
  113.             if (elem.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
  114.                 break;
  115.             if (elem.tagName.match(/^H[1-6]$/)) {
  116.                 head = elem;
  117.                 head.insertAdjacentHTML('BeforeEnd', '<SPAN CLASS=ilang></SPAN>');
  118.             }
  119.         }
  120.  
  121.         var td = hdr.insertCell(0);
  122.         if (td) {
  123.             // Localizable strings.
  124.             var L_Filter_Tip = "Language Filtering";    // tooltip for language button
  125.             var L_Language = "Language";                // heading for menu of programming languages
  126.             var L_Show_All = "Show All";                // label for 'show all languages' menu item
  127.  
  128.             // Add the language button to the button bar.
  129.             td.className = "button1";
  130.             td.style.width = "19px";
  131.             td.onclick = langMenu;
  132.             td.innerHTML = '<IMG SRC="' + baseUrl + 'Filter.gif' + '" ALT="' +
  133.                 L_Filter_Tip + '" BORDER=0>';
  134.  
  135.             // Add the menu.
  136.             var div = '<DIV ID="lang_menu" CLASS=langMenu><B>' + L_Language + '</B><UL>';
  137.             for (var i = 0; i < langs.length; i++)
  138.                 div += '<LI><A HREF="" ONCLICK="chooseLang(this)">' + langs[i] + '</A><BR>';
  139.             div += '<LI><A HREF="" ONCLICK="chooseAll()">' + L_Show_All + '</A></UL></DIV>';
  140.             document.body.insertAdjacentHTML('BeforeEnd', div);
  141.         }
  142.  
  143.         if (!showAll)
  144.             filterLang();
  145.     }
  146. }
  147.  
  148. function initPreElem(pre)
  149. {
  150.     var htm0 = pre.outerHTML;
  151.  
  152.     var reLang = /<span\b[^>]*class="?lang"?[^>]*>/i;
  153.     var iFirst = -1;
  154.     var iSecond = -1;
  155.  
  156.     iFirst = htm0.search(reLang);
  157.     if (iFirst >= 0) {
  158.         iPos = iFirst + 17;
  159.         iMatch = htm0.substr(iPos).search(reLang);
  160.         if (iMatch >= 0)
  161.             iSecond = iPos + iMatch;
  162.     }
  163.  
  164.     if (iSecond < 0) {
  165.         var htm1 = trimPreElem(htm0);
  166.         if (htm1 != htm0) {
  167.             pre.insertAdjacentHTML('AfterEnd', htm1);
  168.             pre.outerHTML = "";
  169.         }
  170.     }
  171.     else {
  172.         var rePairs = /<(\w+)\b[^>]*><\/\1>/gi;
  173.  
  174.         var substr1 = htm0.substring(0,iSecond);
  175.         var tags1 = substr1.replace(/>[^<>]+(<|$)/g, ">$1");
  176.         var open1 = tags1.replace(rePairs, "");
  177.         open1 = open1.replace(rePairs, "");
  178.  
  179.         var substr2 = htm0.substring(iSecond);
  180.         var tags2 = substr2.replace(/>[^<>]+</g, "><");
  181.         var open2 = tags2.replace(rePairs, "");
  182.         open2 = open2.replace(rePairs, "");
  183.  
  184.         pre.insertAdjacentHTML('AfterEnd', open1 + substr2);
  185.         pre.insertAdjacentHTML('AfterEnd', trimPreElem(substr1 + open2));
  186.         pre.outerHTML = "";
  187.     }    
  188. }
  189.  
  190. function trimPreElem(htm)
  191. {
  192.     return htm.replace(/[ \r\n]*((<\/[BI]>)*)[ \r\n]*<\/PRE>/g, "$1</PRE>").replace(
  193.         /\w*<\/SPAN>\w*((<[BI]>)*)\w*\r\n/g, "\r\n</SPAN>$1"
  194.         );
  195. }
  196.  
  197. function getBlock(elem)
  198. {
  199.     while (elem && elem.tagName.match(/^[BIUA]|(SPAN)|(CODE)|(TD)$/))
  200.         elem = elem.parentElement;
  201.     return elem;
  202. }
  203.  
  204. function langMenu()
  205. {
  206.     bodyOnClick();
  207.  
  208.     window.event.returnValue = false;
  209.     window.event.cancelBubble = true;
  210.  
  211.     var div = document.all.lang_menu;
  212.     var lnk = window.event.srcElement;
  213.     if (div && lnk) {
  214.         var x = lnk.offsetLeft + lnk.offsetWidth - div.offsetWidth;
  215.         div.style.pixelLeft = (x < 0) ? 0 : x;
  216.         div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
  217.         div.style.visibility = "visible";
  218.     }
  219. }
  220.  
  221. function chooseLang(item)
  222. {
  223.     window.event.returnValue = false;
  224.     window.event.cancelBubble = true;
  225.  
  226.     if (item) {
  227.         closeMenu();
  228.         curLang = item.innerText;
  229.         showAll = false;
  230.     }
  231.  
  232.     if (cook) {
  233.         cook.putValue('lang', curLang);
  234.         cook.putValue('lang.all', '');
  235.     }
  236.  
  237.     filterLang();
  238. }
  239.  
  240. function chooseAll()
  241. {
  242.     window.event.returnValue = false;
  243.     window.event.cancelBubble = true;
  244.  
  245.     closeMenu();
  246.  
  247.     showAll = true;
  248.     if (cook)
  249.         cook.putValue('lang.all', '1');
  250.  
  251.     unfilterLang();
  252. }
  253.  
  254. function closeMenu()
  255. {
  256.     var div = document.all.lang_menu;
  257.     if (div && div.style.visibility != "hidden") {
  258.         var lnk = document.activeElement;
  259.         if (lnk && lnk.tagName == "A")
  260.             lnk.blur();
  261.  
  262.         div.style.visibility = "hidden";
  263.     }
  264. }
  265.  
  266. function getNext(elem)
  267. {
  268.     for (var i = elem.sourceIndex + 1; i < document.all.length; i++) {
  269.         var next = document.all[i];
  270.         if (!elem.contains(next))
  271.             return next;
  272.     }
  273.     return null;
  274. }
  275.  
  276. function filterMatch(text, name)
  277. {
  278.     var a = text.split(",");
  279.     for (var iTok = 0; iTok < a.length; iTok++) {
  280.         var m = a[iTok].match(/([A-Za-z].*[A-Za-z+])/);
  281.         if (m && m[1] == name)
  282.             return true;
  283.     }
  284.     return false;
  285. }
  286.  
  287. function topicHeading(head)
  288. {
  289.     var iLim = document.body.children.length;
  290.     var idxLim = head.sourceIndex;
  291.  
  292.     for (var i = 0; i < iLim; i++) {
  293.         var elem = document.body.children[i];
  294.         if (elem.sourceIndex < idxLim) {
  295.             if (elem.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
  296.                 return false;
  297.         }
  298.         else
  299.             break;
  300.     }
  301.     return true;
  302. }
  303.  
  304. function filterLang()
  305. {
  306.     var spans = document.all.tags("SPAN");
  307.     for (var i = 0; i < spans.length; i++) {
  308.         var elem = spans[i];
  309.         if (elem.className == "lang") {
  310.             var newVal = filterMatch(elem.innerText, curLang) ? "block" : "none";
  311.             var block = getBlock(elem);
  312.             block.style.display = newVal;
  313.             elem.style.display = "none";
  314.  
  315.             if (block.tagName == "DT") {
  316.                 var next = getNext(block);
  317.                 if (next && next.tagName == "DD")
  318.                     next.style.display = newVal;
  319.             }
  320.             else if (block.tagName == "DIV") {
  321.                 block.className = "filtered2";
  322.             }
  323.             else if (block.tagName.match(/^H[1-6]$/)) {
  324.                 if (topicHeading(block)) {
  325.                     if (newVal != "none") {
  326.                         var tag = null;
  327.                         if (block.children && block.children.length) {
  328.                             tag = block.children[block.children.length - 1];
  329.                             if (tag.className == "ilang") {
  330.                                 tag.innerHTML = (newVal == "block") ?
  331.                                     '  [Language: ' + curLang + ']' : "";
  332.                             }
  333.                         }
  334.                     }
  335.                 }
  336.                 else {
  337.                     var next = getNext(block);
  338.                     while (next && !next.tagName.match(/^(H[1-6])|(DIV)$/)) {
  339.                         next.style.display = newVal;
  340.                         next = getNext(next);
  341.                     }
  342.                 }
  343.             }
  344.